﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;
using Uol.PagSeguro.Domain;
using System.Web;

namespace AgileSaude.Business.Process
{
    internal class PedidoProcess
    {
        internal Resultado Incluir(PedidoEntities pObj)
        {
            Resultado resultado = new Resultado();

            try
            {
                resultado.Sucesso = true;

                pedido obj = new pedido();
                Util.CopyPropertyValues(pObj, obj);

                new pedidoRepository().Add(obj);

                PedidoEntities ped = GetPedido(pObj.Numero);

                foreach (Pedido_ServicosEntities item in pObj.Servicos)
                {
                    item.idPedido = ped.idPedido;
                    new Pedido_ServicosProcess().Incluir(item);
                }

                EnviarPedido(ped);
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "PedidoProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(PedidoEntities pObj)
        {
            Resultado resultado = new Resultado();
            pedidoRepository pedidoRepository = new pedidoRepository();

            try
            {
                pedido user = pedidoRepository.getpedido(pObj.idPedido);
                Util.CopyPropertyValues(pObj, user);

                pedidoRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal PedidoEntities GetPedido(int pIdPedido)
        {
            pedido oData = new pedidoRepository().getpedido(pIdPedido);

            if (oData == null)
            {
                return new PedidoEntities();
            }
            else
            {
                return GetPedido(oData);
            }

        }

        internal PedidoEntities GetPedido(string pNumero)
        {
            pedido oData = new pedidoRepository().getpedido(pNumero);

            if (oData != null)
            {
                return GetPedido(oData);
            }
            else
            {
                return null;
            }

        }

        internal PedidoEntities GetPedidoByVoucher(string pVoucher)
        {
            pedido oData = new pedidoRepository().getpedidoByVoucher(pVoucher);

            if (oData != null)
            {
                return GetPedido(oData);
            }
            else
            {
                return null;
            }

        }

        internal PedidoEntities GetPedidoBy(string pNumero)
        {
            pedido oData = new pedidoRepository().getpedido(pNumero);

            if (oData != null)
            {
                return GetPedido(oData);
            }
            else
            {
                return null;
            }

        }

        private static PedidoEntities GetPedido(pedido oData)
        {
            PedidoEntities oEntitie = new PedidoEntities();

            Util.CopyPropertyValues(oData, oEntitie);

            Resultado resultado = new Resultado();

            oEntitie.Servicos = new Pedido_ServicosProcess().Listar(oData.idPedido, ref resultado);

            oEntitie.Medico = new MedicoProcess().GetMedico(oData.idMedico);

            oEntitie.Usuario = new UsuarioProcess().GetUsuario(oData.idUsuario);

            return oEntitie;
        }

        internal List<PedidoEntities> Listar(PedidoEntities pFiltro, ref Resultado resultado)
        {
            List<PedidoEntities> lista = new List<PedidoEntities>();

            if (pFiltro == null)
            {
                pFiltro = new PedidoEntities();
            }

            try
            {
                var pedido = from u in new pedidoRepository().GetAll()
                             where (string.IsNullOrEmpty(pFiltro.Numero) || u.Numero.ToUpper().Contains(pFiltro.Numero.ToUpper())) &&
                              (pFiltro.idPedido == 0 || u.idPedido == pFiltro.idPedido)
                             select u;

                foreach (pedido user in pedido)
                {
                    lista.Add(GetPedido(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "PedidoProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal List<PedidoEntities> Listar(DateTime pDtIni, DateTime pDtFim, int pIdMedico)
        {
            List<PedidoEntities> lista = new List<PedidoEntities>();

            try
            {
                var pedido = from u in new pedidoRepository().GetAll()
                             where (pIdMedico == 0 || u.idMedico == pIdMedico) && u.DataAtendimento >= pDtIni && u.DataAtendimento <= pDtFim
                             select u;

                foreach (pedido obj in pedido)
                {
                    lista.Add(GetPedido(obj));
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lista;
        }

        internal List<PedidoEntities> ListarPorData(DateTime pDtIni, DateTime pDtFim, int pIdMedico)
        {
            List<PedidoEntities> lista = new List<PedidoEntities>();

            try
            {
                var pedido = from u in new pedidoRepository().GetAll()
                             where (pIdMedico == 0 || u.idMedico == pIdMedico) && u.Data >= pDtIni && u.Data <= pDtFim
                             select u;

                foreach (pedido obj in pedido)
                {
                    lista.Add(GetPedido(obj));
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lista;
        }

        internal List<PedidoEntities> CopyFromPagSeguro(TransactionSearchResult pResult)
        {
            List<PedidoEntities> Pedidos = new List<PedidoEntities>();

            foreach (TransactionSummary summary in pResult.Transactions)
            {
                pedido oData = new pedidoRepository().getpedido(summary.Reference);
                if (oData != null)
                    Pedidos.Add(GetPedido(oData));
            }

            return Pedidos;
        }

        internal Resultado AtualizaStatus(string pNumero, string pStatus, string pTransactionCode)
        {
            Resultado result = new Resultado();

            try
            {
                PedidoEntities pObj = GetPedido(pNumero);
                if (pObj != null)
                {
                    if (pObj.Status != pStatus.ToString())
                    {
                        pObj.DataStatus = DateTime.Now;
                        pObj.Status = pStatus;
                    }

                    pObj.transactionCode = pTransactionCode;
                    result = Alterar(pObj);

                    if (pObj.Voucher == null || pObj.Voucher == "")
                    {
                        if (pStatus == "3")
                            GerarVoucher(pObj);
                    }
                }
                else
                    result.Sucesso = true;
            }
            catch (Exception ex)
            {
                result.Sucesso = false;
                Mensagem msg = new Mensagem();
                msg.Descricoes.Add(ex.Message);
                msg.Campo = "Status";
                result.Mensagens.Add(msg);
            }

            return result;

        }

        internal void AtualizaStatus(TransactionSearchResult pResult)
        {
            foreach (TransactionSummary summary in pResult.Transactions)
            {
                AtualizaStatus(summary.Reference, summary.TransactionStatus.ToString(), summary.Code);
            }
        }

        internal Resultado AtualizaStatus(Transaction transaction)
        {
            return AtualizaStatus(transaction.Reference, transaction.TransactionStatus.ToString(), transaction.Code);
        }

        internal void GerarVoucher(PedidoEntities pObj)
        {
            try
            {
                pObj.Voucher = long.Parse(DateTime.Now.ToString("yyMMddHHmmssffff")).ToString("X");
                pObj.DataPagto = DateTime.Now;
                new PedidoFacade().Alterar(pObj);

                EnviarVoucher(pObj);
            }
            catch (Exception ex)
            { throw ex; }
        }

        internal void EnviarVoucher(PedidoEntities pObj)
        {
            try
            {
                UsuarioEntities user = new UsuarioFacade().GetUsuario(pObj.idUsuario);
                if (user != null)
                {
                    string sNome;
                    if (string.IsNullOrEmpty(pObj.PresenteNome))
                        sNome = user.Nome;
                    else
                        sNome = pObj.PresenteNome;

                    System.IO.StreamReader sr = new System.IO.StreamReader(System.Web.HttpContext.Current.Server.MapPath("~/EmailVoucher.html"));

                    String body = sr.ReadToEnd();

                    sr.Close();
                    sr.Dispose();

                    body = body.Replace("[NUM_VOUCHER]", pObj.Voucher);
                    body = body.Replace("[NOME_PACIENTE]", sNome);
                    body = body.Replace("[NOME_MEDICO]", pObj.Medico.Nome);
                    body = body.Replace("[ENDERECO]", pObj.Medico.Endereco);
                    body = body.Replace("[TELEFONE]", pObj.Medico.Telefone1);

                    //System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    //sb.AppendLine(string.Format("Parabéns {0}! <br/>", sNome));
                    //sb.AppendLine("Seu pagamento acabou de ser confirmado <br/>");
                    //sb.AppendLine(string.Format("O número do seu voucher é {0} <br/>", pObj.Voucher));
                    //sb.AppendLine("Entre em contato com a clínica para efetuar o agendamento. <br/>");
                    //sb.AppendLine("Agradecemos a preferência <br/>");
                    //sb.AppendLine("www.agilesaude.com.br <br/>");

                    Mail email = new Mail();
                    email.CorpoHTML = body; // sb.ToString();
                    email.AdicionarDestinatario(TipoDestinatario.Para, user.Email);
                    email.Assunto = "Agile Saúde - Voucher";
                    email.EnableSsl = false;
                    email.De = new System.Net.Mail.MailAddress("contato@agilesaude.com.br");

                    email.Enviar();
                }
            }
            catch (Exception ex)
            { }
        }

        internal void EnviarPedido(PedidoEntities pObj)
        {
            try
            {
                UsuarioEntities user = new UsuarioFacade().GetUsuario(pObj.idUsuario);
                if (user != null)
                {
                    System.IO.StreamReader sr = new System.IO.StreamReader(System.Web.HttpContext.Current.Server.MapPath("~/EmailCompra.html"));

                    String body = sr.ReadToEnd();
                    sr.Close();
                    sr.Dispose();

                    body = body.Replace("[NUM_PEDIDO]", pObj.Numero);
                    body = body.Replace("[NOME_PACIENTE]", user.Nome);
                    body = body.Replace("[NOME_MEDICO]", pObj.Medico.Nome);
                    body = body.Replace("[ENDERECO]", pObj.Medico.Endereco);
                    body = body.Replace("[TELEFONE]", pObj.Medico.Telefone1);


                    //System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    //sb.AppendLine(string.Format("Parabéns {0}! <br/>", user.Nome));
                    //sb.AppendLine("Você acabou de efetuar uma compra no www.agilesaude.com.br <br/>");
                    //sb.AppendLine(string.Format("O número de sua compra é {0} <br/>", pObj.Numero));
                    //sb.AppendLine("Estamos aguardando a confirmação do pagamento para envio do seu voucher. <br/>");
                    //sb.AppendLine("Agradecemos a preferência <br/>");
                    //sb.AppendLine("www.agilesaude.com.br <br/>");

                    Mail email = new Mail();
                    email.CorpoHTML = body; // sb.ToString();
                    email.AdicionarDestinatario(TipoDestinatario.Para, user.Email);
                    email.Assunto = "Agile Saúde - Nova Compra";
                    email.EnableSsl = false;
                    email.De = new System.Net.Mail.MailAddress("contato@agilesaude.com.br");

                    email.Enviar();
                }
            }
            catch (Exception ex)
            { }
        }
    }
}
